package com.zbystudy.reflect;

import com.zbystudy.enums.BaseEnum;
import javafx.scene.Parent;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;

/**
 * Created By zby on 18:21 2019/3/16
 * 创建当前对象
 */

public class GenericCurrentObject<T> {

    /**
     * Created By zby on 18:26 2019/3/16
     * 普通的方式创建对象
     */
    public static <T> T byCommonGeneric(Class clazz, String name, BaseEnum baseEnum) {
        if (null == clazz) {
            return null;
        }
        try {
            T t = (T) clazz.newInstance();

            //通过属性赋值,getField获取公有属性，获取私有属性
            Field field = clazz.getDeclaredField("name");
            //跳过检查，否则，我们没办法操作私有属性
            field.setAccessible(true);
            field.set(t, name);

            //通过方法赋值
            Method method1 = clazz.getDeclaredMethod("setFood", String.class);
            method1.setAccessible(true);
            method1.invoke(t, baseEnum.getTitle());

            return t;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * Created By zby on 18:26 2019/3/16
     * 普通的方式创建对象
     */
    public static <T> T byConstruct(Class clazz, String name, BaseEnum baseEnum) {
        if (null == clazz) {
            return null;
        }
//        参数类型，
        Class paramType[] = {String.class, String.class};
        try {
//          一般情况下，构造器不止一个，我们根据构器的参数类型，来使用构造器创建对象
            Constructor constructor = clazz.getConstructor(paramType);
//            给构造器赋值，赋值个数和构造器的形参个数一样，否则，会报错
            return (T) constructor.newInstance(name, baseEnum.getTitle());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
